package xyz.fefine;

/**
 * Created by feng_ on 2016/9/2.
 * 标识符名称
 */
public class Name extends ASTLeaf {

    protected static int UNKOWN = -1;
    //name所在的位置
    protected int nest,index;

    Name(Token token) {
        super(token);
        index = UNKOWN;
    }
    public String name(){
        return token().getString();
    }

    @Override
    public void lookup(Symbols syms) {

        Symbols.Location loc = syms.get(name());
        if (loc != null) {
            nest = loc.nest;
            index = loc.index;
        }
//        else {
//            当函数中调用其他未声明(还未解释到)的函数时会报错,
//            注释掉之后当函数中使用未声明的变量是不会报错,只能在执行时(eval)发生错误
//            throw new StoneException("undefined name: " + name(),this);
//        }
    }

    /**
     * 赋值
     * @param sms 环境
     */
    public void lookupForAssign(Symbols sms) {
        Symbols.Location loc = sms.put(name());
        nest = loc.nest;
        index = loc.index;
    }

    /**
     * 先判断是否为全局变量
     * @param enviorment 环境
     * @return 值
     */
    @Override
    public Object eval(Enviorment enviorment) {

        if (index == UNKOWN) {
            //全局变量
            return enviorment.get(name());
        } else {
            return enviorment.get(nest, index);
        }

/*        //这里有待研究
        Object res = enviorment.get(name());
        if (res != null) {
            return res;
        }else{
            throw new StoneException("undefined name " + name(),this);
        }*/
    }

    /**
     *  赋值前
     * @param env 环境
     * @param val 值
     */
    public void evalForAssign(Enviorment env, Object val) {
        if (index == UNKOWN) {
            env.put(name(), val);
        } else {
            env.put(nest, index, val);
        }
    }
}
